package com.powergame.model;

import java.awt.Polygon;
import java.util.ArrayList;
import java.util.List;

/**
 * Secteur.java
 *
 * Modélise une case du plateau
 *
 * @author ToF
 */
public class Secteur {
    
    /** Le plateau qui contient le secteur */
    private Plateau plateau = null;
    
    /** Identifiant unique sur le plateau */
    private String id = null;
    
    /** Terre ?, Ile ?, Mer ? etc... */
    private TypeSecteur type = null;
    
    /** Indique a qui appartient le territoire initialement */
    private Equipe equipe = null;
    
    /** Les pièces présentes sur le secteur */
    private List<Piece> pieces = null;
    
    /** Les secteurs voisins */
    private List<Secteur> voisins = null;
    
    /** Les dimensions du secteur */
    private Polygon polygone = null;
    
    
    // Pour le pathfinding
    public Secteur parent = null;
    public double G = 0.0;
    public double F = 0.0;
    public double H = 0.0;
    
    public Secteur(Plateau plateau, String id, TypeSecteur type, Equipe equipe){
        this.plateau = plateau;
        this.id = id;
        this.type = type;
        this.equipe = equipe;
    }

    public Equipe getEquipe() {
        return equipe;
    }

    public void setEquipe(Equipe equipe) {
        this.equipe = equipe;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public List<Piece> getPieces() {
        if(pieces == null){
            pieces = new ArrayList<Piece>();
        }
        return pieces;
    }

    public void setPieces(List<Piece> pieces) {
        this.pieces = pieces;
    }

    public Plateau getPlateau() {
        return plateau;
    }

    public void setPlateau(Plateau plateau) {
        this.plateau = plateau;
    }

    public TypeSecteur getType() {
        return type;
    }

    public void setType(TypeSecteur type) {
        this.type = type;
    }

    public List<Secteur> getVoisins() {
        if(voisins == null){
            voisins = new ArrayList<Secteur>();
        }
        return voisins;
    }

    public void setVoisins(List<Secteur> voisins) {
        this.voisins = voisins;
    }

    @Override
    public boolean equals(Object o) {
        Secteur s = (Secteur)o;
        return getId().equals(s.getId());
    }

    public void ajouteVoisin(Secteur voisin) {
        if(!getVoisins().contains(voisin)){
            getVoisins().add(voisin);
        }
        if(!voisin.getVoisins().contains(this)){
            voisin.getVoisins().add(this);
        }
    }

    public Polygon getPolygone() {
        /*if(polygone == null){
            polygone = new Polygon();
        }*/
        return polygone;
    }

    public void setPolygone(Polygon polygone) {
        this.polygone = polygone;
    }
    
    @Override
    public String toString() {
        return "Secteur{" + "id=" + id + ", type=" + type + '}';
    }

    boolean isTraversable(TypePiece typePiece) {
        return typePiece.traverse(getType());
    }

    public Piece getPieceParType(Equipe equipe, TypePiece type) {
        
        for(Piece p : getPieces()){
            if(p.getEquipe().equals(equipe)
             && p.getType().equals(type)){
                return p;
            }
        }
        return null;
    }
}
